#include <iostream>
#include <vector>
#include <algorithm>

using namespace std;

int main() {
    // 输入获取
    int r, d;
    cin >> r;
    vector<int> N(r+1);
    for(int i = 0; i < r+1; i++){
        cin >> N[i];
    }
    cin >> d;

    // 算法入口
    vector<int> D;
    while (d > 0) {
        D.push_back(d % 2);
        d /= 2;
    }
    reverse(D.begin(), D.end());

    int count = 0;

    if (N.size() > D.size()) {
        for (int i = D.size(); i < N.size(); ++i) {
            count += N[i];
        }
    }

    while (true) {
        vector<int> D2 = D;  // 复制一份

        for (int i = D.size() - 1; i > 0; --i) {
            if (N[i] > 0) {
                int diff = N[i] - D2[i];

                if (diff >= 0) {
                    N[i] = diff;
                    D2[i] = 0;
                } else {
                    D2[i] = 0;
                    D2[i - 1] += abs(diff) * 2;
                    N[i] = 0;
                }
            } else {
                D2[i - 1] += D2[i] * 2;
                D2[i] = 0;
            }
        }

        bool flag = false;

        if (N[0] >= D2[0]) {
            N[0] -= D2[0];
            count += 1;
        } else {
            N[0] -= D2[0];
            D2[0] = 0;

            for (int i = 0; i < D.size(); ++i) {
                if (N[i] < 0) {
                    if (i != D.size() - 1) {
                        N[i + 1] += N[i] >> 1;
                        N[i] = 0;
                    } else {
                        flag = true;
                    }
                } else {
                    count += 1;
                    break;
                }
            }
        }

        if (flag) {
            break;
        }
    }

    // 输出结果
    cout << count << endl;

    return 0;
}
